//! Upravljanje prekidima - razina jezgre

#define _J_POZIVI_JEZGRE_C_
#include "pozivi_jezgre.h"

#include "tipovi.h"
#include "razno.h"
#include "ispis.h"

//struktura za prijenos podataka u jezgrinu funkciju
static j_param_t j_param;

//pozivanje jezgrinih funkcija ide preko ovog poziva
int j_funkcija(int id, void *param)
{
	volatile int povratna_vrijednost = -1, prije;

	prije = j_dozvoli_prekide(0); //zabrani prekide

	j_param.id = id;
	j_param.param = param;
	j_param.povr_vr = (int *) &povratna_vrijednost;
	
	j_programski_prekid();

	j_dozvoli_prekide(prije);

	return povratna_vrijednost;
}

//poziva se iz prekidne funkcije
void j_pozivi_jezgre(int id) //'id' = PREKIDI_PROGRAMSKI
{
	if (j_param.id < 0 || j_param.id > BROJ_J_FUNKCIJA)
		j_ispisi("id van granica (%d)", j_param.id);
	else
		*(j_param.povr_vr) = (j_fun[j_param.id])(j_param.param);
}



//implementacije - par primjera

int funkcija1 (void *x)
{
	//povecava vrijednost za 1 (pretpostavlja int *)
	int *p = x;
	
	PARAMNULL(p);
	
	*p += 1;

	return 7;
}

int funkcija2 (void *x)
{
	//racuna duljinu teksta (pretpostavlja char *)
	int i;
	char *c = x;
	
	PARAMNULL(c);

	for (i = 0; c[i] != 0; i++)
		;

	return i + 1;
}

int funkcija3 (void *x)
{
	//trazi najmanji broj (pretpostavlja pointer na {int, double[]})
	int *np = x;
	double *p;
	int n, i, min = -1;
	
	PARAMNULL(np);

	n = *np;
	np++;
	p = (double *) np;

	if (n > 0) {
		min = 0;

		for (i = 1; i < n; i++)
			if (p[i] < p[min])
				min = i;
	}
	
	return min;
}
